import { getSheetIndex } from '../methods/get'
import { luckysheet_searcharray } from './sheetSearch'
import { selectHightlightShow } from './select'
import { createFilterOptions } from './filter'
import server from './server'
import menuButton from './menuButton'
import luckysheetPostil from './postil'
import luckysheetDropCell from './dropCell'
import { rowLocationByIndex, colLocationByIndex } from '../global/location'
import Store from '../store'
import locale from '../locale/locale'
import { luckysheetrefreshgrid } from '../global/refresh'

const luckysheetFreezen = {
  freezenHorizontalHTML:
    '<div id="luckysheet-freezebar-horizontal" class="luckysheet-freezebar" tabindex="0"><div class="luckysheet-freezebar-handle luckysheet-freezebar-horizontal-handle" ><div class="luckysheet-freezebar-handle-bar luckysheet-freezebar-horizontal-handle-title" ></div><div class="luckysheet-freezebar-handle-bar luckysheet-freezebar-horizontal-handle-bar" ></div></div><div class="luckysheet-freezebar-drop luckysheet-freezebar-horizontal-drop" ><div class="luckysheet-freezebar-drop-bar luckysheet-freezebar-horizontal-drop-title" ></div><div class="luckysheet-freezebar-drop-bar luckysheet-freezebar-horizontal-drop-bar" >&nbsp;</div></div></div>',
  freezenVerticalHTML:
    '<div id="luckysheet-freezebar-vertical" class="luckysheet-freezebar" tabindex="0"><div class="luckysheet-freezebar-handle luckysheet-freezebar-vertical-handle" ><div class="luckysheet-freezebar-handle-bar luckysheet-freezebar-vertical-handle-title" ></div><div class="luckysheet-freezebar-handle-bar luckysheet-freezebar-vertical-handle-bar" ></div></div><div class="luckysheet-freezebar-drop luckysheet-freezebar-vertical-drop" ><div class="luckysheet-freezebar-drop-bar luckysheet-freezebar-vertical-drop-title" ></div><div class="luckysheet-freezebar-drop-bar luckysheet-freezebar-vertical-drop-bar" >&nbsp;</div></div></div>',
  initialHorizontal: true,
  initialVertical: true,
  horizontalmovestate: false,
  horizontalmoveposition: null,
  verticalmovestate: false,
  verticalmoveposition: null,
  windowHeight: null,
  windowWidth: null,
  freezenhorizontaldata: null,
  freezenverticaldata: null,
  // 定义冻结首行、首列是实际的第一行第一列还是当前视图的第一行第一列
  // excel 为视图的第一行第一列，但此处实现有问题，如滚动到15行冻结首行，当前冻结了15行，保存再进去实际冻结了第一行
  // 冻结真实的第一行、第一列更符合直觉
  freezenRealFirstRowColumn: true,
  cutVolumn: function(arr, cutindex) {
    if (cutindex <= 0) {
      return arr
    }

    let pre = arr.slice(0, cutindex)
    let premax = pre[pre.length - 1]
    let ret = arr.slice(cutindex)

    // for (let i = 0; i < ret.length; i++) {
    //     ret[i] -= premax;
    // }

    return ret
  },
  cancelFreezenVertical: function(sheetIndex) {
    let _this = this

    const _locale = locale()
    const locale_freezen = _locale.freezen
    // 解决freeze 不垂直居中的问题
    const freezeHTML = `
            <div class="luckysheet-toolbar-button-outer-box luckysheet-inline-block"
            style="user-select: none;">
                <div class="luckysheet-toolbar-button-inner-box luckysheet-inline-block"
                style="user-select: none;">
                    <div class="luckysheet-icon luckysheet-inline-block " style="user-select: none;">
                        <div aria-hidden="true" class="luckysheet-icon-img-container luckysheet-icon-img luckysheet-icon-function lksticonfont  luckysheet-lksticonfont -dongjie1"
                        style="user-select: none;">
                        </div>
                    </div>
                    <div class="luckysheet-toolbar-menu-button-caption luckysheet-inline-block"
                    style="user-select: none;">
                        ${locale_freezen.default}
                    </div>
                </div>
            </div>
        `

    $('#luckysheet-freezen-btn-horizontal').html(freezeHTML)

    $('#luckysheet-freezen-btn-vertical').html(
      '<i class="fa fa-indent"></i> ' + locale_freezen.freezenColumn
    )
    _this.freezenverticaldata = null
    let isvertical = $('#luckysheet-freezebar-vertical').is(':visible')
    $('#luckysheet-freezebar-vertical').hide()

    if (sheetIndex == null) {
      sheetIndex = Store.currentSheetIndex
    }

    let currentSheet = Store.luckysheetfile[getSheetIndex(sheetIndex)]
    if (currentSheet.freezen != null) {
      currentSheet.freezen.vertical = null
    }

    if (currentSheet.frozen != null && isvertical) {
      server.saveParam('all', sheetIndex, currentSheet.frozen, { k: 'frozen' })
    }
  },
  createFreezenVertical: function(freezenverticaldata, left) {
    let _this = this

    if (_this.initialVertical) {
      _this.initialVertical = false
      $('#luckysheet-grid-window-1').append(_this.freezenVerticalHTML)

      $('#luckysheet-freezebar-vertical')
        .find('.luckysheet-freezebar-vertical-drop')
        .hover(
          function() {
            $(this)
              .parent()
              .addClass('luckysheet-freezebar-hover')
          },
          function() {
            $(this)
              .parent()
              .removeClass('luckysheet-freezebar-hover')
          }
        )

      $('#luckysheet-freezebar-vertical')
        .find('.luckysheet-freezebar-vertical-drop')
        .mousedown(function() {
          _this.verticalmovestate = true
          _this.verticalmoveposition = $(this).position().left
          _this.windowWidth = $('#luckysheet-grid-window-1').width()

          $(this)
            .parent()
            .addClass('luckysheet-freezebar-active')
          $('#luckysheet-freezebar-vertical')
            .find('.luckysheet-freezebar-vertical-handle')
            .css('cursor', '-webkit-grabbing')
        })

      let gridheight = $('#luckysheet-grid-window-1').height()
      $('#luckysheet-freezebar-vertical')
        .find('.luckysheet-freezebar-vertical-handle')
        .css({
          height: gridheight - 10,
          width: '4px',
          cursor: '-webkit-grab',
          top: '0px',
        })
        .end()
        .find('.luckysheet-freezebar-vertical-drop')
        .css({
          height: gridheight - 10,
          width: '4px',
          top: '0px',
          cursor: '-webkit-grab',
        })
    }

    if (freezenverticaldata == null) {
      if (_this.freezenRealFirstRowColumn) {
        let dataset_col_st = 0
        left =
          Store.visibledatacolumn[dataset_col_st] - 2 + Store.rowHeaderWidth
        freezenverticaldata = [
          Store.visibledatacolumn[dataset_col_st],
          dataset_col_st + 1,
          0,
          _this.cutVolumn(Store.visibledatacolumn, dataset_col_st + 1),
          left,
        ]
      } else {
        let scrollLeft = $('#luckysheet-cell-main').scrollLeft()
        let dataset_col_st = luckysheet_searcharray(
          Store.visibledatacolumn,
          scrollLeft
        )
        if (dataset_col_st == -1) {
          dataset_col_st = 0
        }

        left =
          Store.visibledatacolumn[dataset_col_st] -
          2 -
          scrollLeft +
          Store.rowHeaderWidth
        freezenverticaldata = [
          Store.visibledatacolumn[dataset_col_st],
          dataset_col_st + 1,
          scrollLeft,
          _this.cutVolumn(Store.visibledatacolumn, dataset_col_st + 1),
          left,
        ]
      }

      _this.saveFreezen(null, null, freezenverticaldata, left)
    }

    _this.freezenverticaldata = freezenverticaldata

    // $("#luckysheet-freezen-btn-horizontal").html('<i class="luckysheet-icon-img-container lksticonfont  luckysheet-lksticonfont -dongjie1"></i> '+locale().freezen.freezenCancel);

    // 解决freeze 不垂直居中的问题
    const freezeHTML = `
            <div class="luckysheet-toolbar-button-outer-box luckysheet-inline-block"
            style="user-select: none;">
                <div class="luckysheet-toolbar-button-inner-box luckysheet-inline-block"
                style="user-select: none;">
                    <div class="luckysheet-icon luckysheet-inline-block " style="user-select: none;">
                        <div aria-hidden="true" class="luckysheet-icon-img-container luckysheet-icon-img luckysheet-icon-function lksticonfont  luckysheet-lksticonfont -dongjie1"
                        style="user-select: none;">
                        </div>
                    </div>
                    <div class="luckysheet-toolbar-menu-button-caption luckysheet-inline-block"
                    style="user-select: none;">
                        ${locale().freezen.freezenCancel}
                    </div>
                </div>
            </div>
        `
    $('#luckysheet-freezen-btn-horizontal').html(freezeHTML)

    $('#luckysheet-freezebar-vertical')
      .show()
      .find('.luckysheet-freezebar-vertical-handle')
      .css({ left: left })
      .end()
      .find('.luckysheet-freezebar-vertical-drop')
      .css({ left: left })
  },
  saveFreezen: function(freezenhorizontaldata, top, freezenverticaldata, left) {
    let currentSheet =
      Store.luckysheetfile[getSheetIndex(Store.currentSheetIndex)]
    if (currentSheet.freezen == null) {
      currentSheet.freezen = {}
    }

    if (freezenhorizontaldata != null) {
      if (currentSheet.freezen.horizontal == null) {
        currentSheet.freezen.horizontal = {}
      }

      currentSheet.freezen.horizontal.freezenhorizontaldata = freezenhorizontaldata
      currentSheet.freezen.horizontal.top = top
    }

    if (freezenverticaldata != null) {
      if (currentSheet.freezen.vertical == null) {
        currentSheet.freezen.vertical = {}
      }

      currentSheet.freezen.vertical.freezenverticaldata = freezenverticaldata
      currentSheet.freezen.vertical.left = left
    }

    // if(currentSheet.freezen != null){
    //     server.saveParam("all", Store.currentSheetIndex, currentSheet.freezen, { "k": "freezen" });
    // }

    // use new property frozen
    if (currentSheet.frozen != null) {
      server.saveParam('all', Store.currentSheetIndex, currentSheet.frozen, {
        k: 'frozen',
      })
    }
  },
  initialFreezen: function(sheetIndex) {
    let _this = this

    // when init ,we get frozen, but here, we need freezen,so tranform it
    _this.frozenTofreezen()

    let currentSheet = Store.luckysheetfile[getSheetIndex(sheetIndex)]
    if (
      currentSheet.freezen != null &&
      currentSheet.freezen.horizontal != null &&
      currentSheet.freezen.horizontal.freezenhorizontaldata != null
    ) {
      _this.createFreezenHorizontal(
        currentSheet.freezen.horizontal.freezenhorizontaldata,
        currentSheet.freezen.horizontal.top
      )
    } else {
      _this.cancelFreezenHorizontal(sheetIndex)
    }

    if (
      currentSheet.freezen != null &&
      currentSheet.freezen.vertical != null &&
      currentSheet.freezen.vertical.freezenverticaldata != null
    ) {
      _this.createFreezenVertical(
        currentSheet.freezen.vertical.freezenverticaldata,
        currentSheet.freezen.vertical.left
      )
    } else {
      _this.cancelFreezenVertical(sheetIndex)
    }

    _this.createAssistCanvas()
  },
  changeFreezenIndex: function(originindex, type) {
    let _this = this

    if (type == 'v' && _this.freezenverticaldata != null) {
      let freezen_colindex = _this.freezenverticaldata[1]
      let offset = luckysheet_searcharray(
        Store.visibledatacolumn,
        $('#luckysheet-cell-main').scrollLeft()
      )

      if (originindex - offset < freezen_colindex) {
        originindex = originindex - offset
      }
    } else if (type == 'h' && _this.freezenhorizontaldata != null) {
      let freezen_rowindex = _this.freezenhorizontaldata[1]
      let offset = luckysheet_searcharray(
        Store.visibledatarow,
        $('#luckysheet-cell-main').scrollTop()
      )

      if (originindex - offset < freezen_rowindex) {
        originindex = originindex - offset
      }
    }

    return originindex
  },
  scrollFreezen: function() {
    let _this = this

    let row
    let row_focus = Store.luckysheet_select_save[0]['row_focus']
    if (row_focus == Store.luckysheet_select_save[0]['row'][0]) {
      row = Store.luckysheet_select_save[0]['row'][1]
    } else if (row_focus == Store.luckysheet_select_save[0]['row'][1]) {
      row = Store.luckysheet_select_save[0]['row'][0]
    }

    let column
    let column_focus = Store.luckysheet_select_save[0]['column_focus']
    if (column_focus == Store.luckysheet_select_save[0]['column'][0]) {
      column = Store.luckysheet_select_save[0]['column'][1]
    } else if (column_focus == Store.luckysheet_select_save[0]['column'][1]) {
      column = Store.luckysheet_select_save[0]['column'][0]
    }

    if (_this.freezenverticaldata != null) {
      let freezen_colindex = _this.freezenverticaldata[1]

      let offset = luckysheet_searcharray(
        _this.freezenverticaldata[3],
        $('#luckysheet-cell-main').scrollLeft()
      )

      let top = _this.freezenverticaldata[4]

      freezen_colindex += offset

      if (column >= Store.visibledatacolumn.length) {
        column = Store.visibledatacolumn.length - 1
      }

      if (freezen_colindex >= Store.visibledatacolumn.length) {
        freezen_colindex = Store.visibledatacolumn.length - 1
      }

      let column_px = Store.visibledatacolumn[column],
        freezen_px = Store.visibledatacolumn[freezen_colindex]

      if (column_px <= freezen_px + top) {
        setTimeout(function() {
          $('#luckysheet-scrollbar-x').scrollLeft(0)
        }, 100)
      }
    }

    if (_this.freezenhorizontaldata != null) {
      let freezen_rowindex = _this.freezenhorizontaldata[1]

      let offset = luckysheet_searcharray(
        _this.freezenhorizontaldata[3],
        $('#luckysheet-cell-main').scrollTop()
      )

      let left = _this.freezenhorizontaldata[4]

      freezen_rowindex += offset

      if (row >= Store.visibledatarow.length) {
        row = Store.visibledatarow.length - 1
      }

      if (freezen_rowindex >= Store.visibledatarow.length) {
        freezen_rowindex = Store.visibledatarow.length - 1
      }

      let row_px = Store.visibledatarow[row],
        freezen_px = Store.visibledatarow[freezen_rowindex]

      if (row_px <= freezen_px + left) {
        setTimeout(function() {
          $('#luckysheet-scrollbar-y').scrollTop(0)
        }, 100)
      }
    }
  },
  cancelFreezenHorizontal: function(sheetIndex) {
    let _this = this

    // $("#luckysheet-freezen-btn-horizontal").html('<i class="luckysheet-icon-img-container lksticonfont  luckysheet-lksticonfont -dongjie1"></i> '+locale().freezen.default);

    // 解决freeze 不垂直居中的问题
    const freezeHTML = `
            <div class="luckysheet-toolbar-button-outer-box luckysheet-inline-block"
            style="user-select: none;">
                <div class="luckysheet-toolbar-button-inner-box luckysheet-inline-block"
                style="user-select: none;">
                    <div class="luckysheet-icon luckysheet-inline-block " style="user-select: none;">
                        <div aria-hidden="true" class="luckysheet-icon-img-container luckysheet-icon-img luckysheet-icon-function lksticonfont  luckysheet-lksticonfont -dongjie1"
                        style="user-select: none;">
                        </div>
                    </div>
                    <div class="luckysheet-toolbar-menu-button-caption luckysheet-inline-block"
                    style="user-select: none;">
                        ${locale().freezen.default}
                    </div>
                </div>
            </div>
        `

    $('#luckysheet-freezen-btn-horizontal').html(freezeHTML)

    _this.freezenhorizontaldata = null
    let ishorizontal = $('#luckysheet-freezebar-horizontal').is(':visible')
    $('#luckysheet-freezebar-horizontal').hide()

    if (sheetIndex == null) {
      sheetIndex = Store.currentSheetIndex
    }

    let currentSheet = Store.luckysheetfile[getSheetIndex(sheetIndex)]
    if (currentSheet.freezen != null) {
      currentSheet.freezen.horizontal = null
    }

    if (currentSheet.frozen != null && ishorizontal) {
      server.saveParam('all', sheetIndex, currentSheet.frozen, { k: 'frozen' })
    }
  },
  createFreezenHorizontal: function(freezenhorizontaldata, top) {
    let _this = this

    if (_this.initialHorizontal) {
      _this.initialHorizontal = false
      $('#luckysheet-grid-window-1').append(_this.freezenHorizontalHTML)

      $('#luckysheet-freezebar-horizontal')
        .find('.luckysheet-freezebar-horizontal-drop')
        .hover(
          function() {
            $(this)
              .parent()
              .addClass('luckysheet-freezebar-hover')
          },
          function() {
            $(this)
              .parent()
              .removeClass('luckysheet-freezebar-hover')
          }
        )

      $('#luckysheet-freezebar-horizontal')
        .find('.luckysheet-freezebar-horizontal-drop')
        .mousedown(function() {
          _this.horizontalmovestate = true
          _this.horizontalmoveposition = $(this).position().top
          _this.windowHeight = $('#luckysheet-grid-window-1').height()

          $(this)
            .parent()
            .addClass('luckysheet-freezebar-active')
          $('#luckysheet-freezebar-horizontal')
            .find('.luckysheet-freezebar-horizontal-handle')
            .css('cursor', '-webkit-grabbing')
        })

      let gridwidth = $('#luckysheet-grid-window-1').width()
      $('#luckysheet-freezebar-horizontal')
        .find('.luckysheet-freezebar-horizontal-handle')
        .css({
          width: gridwidth - 10,
          height: '4px',
          cursor: '-webkit-grab',
          left: '0px',
        })
        .end()
        .find('.luckysheet-freezebar-horizontal-drop')
        .css({
          width: gridwidth - 10,
          height: '4px',
          left: '0px',
          cursor: '-webkit-grab',
        })
    }

    if (freezenhorizontaldata == null) {
      let dataset_row_st
      if (_this.freezenRealFirstRowColumn) {
        dataset_row_st = 0
        top =
          Store.visibledatarow[dataset_row_st] - 2 + Store.columnHeaderHeight
        freezenhorizontaldata = [
          Store.visibledatarow[dataset_row_st],
          dataset_row_st + 1,
          0,
          _this.cutVolumn(Store.visibledatarow, dataset_row_st + 1),
          top,
        ]
        _this.saveFreezen(freezenhorizontaldata, top, null, null)
        // todo: 没有下面代码 如果有滚动，冻结之后首行的行号仍显示的之前滚动的行号
        // todo: 不 setTimeout 这里直接刷新的话，冻结的首行显示有问题，没有列的分割线
        setTimeout(() => {
          luckysheetFreezen.createAssistCanvas()
          luckysheetrefreshgrid()
        })
      } else {
        let scrollTop = $('#luckysheet-cell-main').scrollTop()
        dataset_row_st = luckysheet_searcharray(Store.visibledatarow, scrollTop)
        if (dataset_row_st == -1) {
          dataset_row_st = 0
        }

        top =
          Store.visibledatarow[dataset_row_st] -
          2 -
          scrollTop +
          Store.columnHeaderHeight
        freezenhorizontaldata = [
          Store.visibledatarow[dataset_row_st],
          dataset_row_st + 1,
          scrollTop,
          _this.cutVolumn(Store.visibledatarow, dataset_row_st + 1),
          top,
        ]
        _this.saveFreezen(freezenhorizontaldata, top, null, null)
      }
    }

    _this.freezenhorizontaldata = freezenhorizontaldata

    // $("#luckysheet-freezen-btn-horizontal").html('<i class="fa fa-list-alt"></i> '+locale().freezen.freezenCancel);

    // $("#luckysheet-freezen-btn-horizontal").html('<i class="luckysheet-icon-img-container lksticonfont  luckysheet-lksticonfont -dongjie1"></i> '+locale().freezen.freezenCancel);

    const freezeHTML = `
            <div class="luckysheet-toolbar-button-outer-box luckysheet-inline-block"
            style="user-select: none;">
                <div class="luckysheet-toolbar-button-inner-box luckysheet-inline-block"
                style="user-select: none;">
                    <div class="luckysheet-icon luckysheet-inline-block " style="user-select: none;">
                        <div aria-hidden="true" class="luckysheet-icon-img-container luckysheet-icon-img luckysheet-icon-function lksticonfont  luckysheet-lksticonfont -dongjie1"
                        style="user-select: none;">
                        </div>
                    </div>
                    <div class="luckysheet-toolbar-menu-button-caption luckysheet-inline-block"
                    style="user-select: none;">
                        ${locale().freezen.freezenCancel}
                    </div>
                </div>
            </div>
        `

    $('#luckysheet-freezen-btn-horizontal').html(freezeHTML)

    $('#luckysheet-freezebar-horizontal')
      .show()
      .find('.luckysheet-freezebar-horizontal-handle')
      .css({ top: top })
      .end()
      .find('.luckysheet-freezebar-horizontal-drop')
      .css({ top: top })
  },
  createAssistCanvas: function() {
    let _this = this
    _this.removeAssistCanvas()

    if (
      _this.freezenverticaldata != null ||
      _this.freezenhorizontaldata != null
    ) {
      let freezen_horizon_px, freezen_horizon_ed, freezen_horizon_scrollTop
      let freezen_vertical_px, freezen_vertical_ed, freezen_vertical_scrollTop
      let drawWidth = Store.luckysheetTableContentHW[0],
        drawHeight = Store.luckysheetTableContentHW[1]

      //双向freezen
      if (
        _this.freezenverticaldata != null &&
        _this.freezenhorizontaldata != null
      ) {
        freezen_horizon_px = _this.freezenhorizontaldata[0]
        freezen_horizon_ed = _this.freezenhorizontaldata[1]
        freezen_horizon_scrollTop = _this.freezenhorizontaldata[2]

        freezen_vertical_px = _this.freezenverticaldata[0]
        freezen_vertical_ed = _this.freezenverticaldata[1]
        freezen_vertical_scrollTop = _this.freezenverticaldata[2]

        //3
        _this.createCanvas(
          'freezen_3',
          freezen_vertical_px - freezen_vertical_scrollTop,
          freezen_horizon_px - freezen_horizon_scrollTop + 1,
          Store.rowHeaderWidth - 1,
          Store.columnHeaderHeight - 1
        )
        //4
        _this.createCanvas(
          'freezen_4',
          drawWidth - freezen_vertical_px + freezen_vertical_scrollTop,
          freezen_horizon_px - freezen_horizon_scrollTop + 1,
          freezen_vertical_px -
            freezen_vertical_scrollTop +
            Store.rowHeaderWidth -
            1,
          Store.columnHeaderHeight - 1
        )
        //7
        _this.createCanvas(
          'freezen_7',
          freezen_vertical_px - freezen_vertical_scrollTop,
          drawHeight -
            freezen_horizon_px +
            freezen_horizon_scrollTop -
            Store.columnHeaderHeight,
          Store.rowHeaderWidth - 1,
          freezen_horizon_px -
            freezen_horizon_scrollTop +
            Store.columnHeaderHeight -
            1
        )
      }
      //水平freezen
      else if (_this.freezenhorizontaldata != null) {
        freezen_horizon_px = _this.freezenhorizontaldata[0]
        freezen_horizon_ed = _this.freezenhorizontaldata[1]
        freezen_horizon_scrollTop = _this.freezenhorizontaldata[2]

        _this.createCanvas(
          'freezen_h',
          drawWidth,
          freezen_horizon_px - freezen_horizon_scrollTop + 1,
          Store.rowHeaderWidth - 1,
          Store.columnHeaderHeight - 1
        )
      }
      //垂直freezen
      else if (_this.freezenverticaldata != null) {
        freezen_vertical_px = _this.freezenverticaldata[0]
        freezen_vertical_ed = _this.freezenverticaldata[1]
        freezen_vertical_scrollTop = _this.freezenverticaldata[2]

        _this.createCanvas(
          'freezen_v',
          freezen_vertical_px - freezen_vertical_scrollTop,
          drawHeight,
          Store.rowHeaderWidth - 1,
          Store.columnHeaderHeight - 1
        )
      }

      _this.scrollAdapt()
    }
  },
  createCanvas: function(id, width, height, left, top) {
    let c = $('<canvas/>')
      .appendTo('#luckysheet-grid-window-1')
      .attr({
        id: id,
        width: Math.ceil(width * Store.devicePixelRatio),
        height: Math.ceil(height * Store.devicePixelRatio),
      })
      .css({
        'user-select': 'none',
        postion: 'absolute',
        left: left,
        top: top,
        width: width,
        height: height,
        'z-index': 3010,
        'pointer-events': 'none',
      })
  },
  removeAssistCanvas: function() {
    $('#luckysheet-grid-window-1 > canvas')
      .not($('#luckysheetTableContent'))
      .remove()
    $('#luckysheet-cell-selected').css('z-index', 3015)
  },
  scrollAdapt: function() {
    let _this = this

    //有冻结时 选区框 滚动适应
    if (
      Store.luckysheet_select_save != null &&
      Store.luckysheet_select_save.length > 0
    ) {
      _this.scrollAdaptOfselect()
    }

    //有冻结时 图表框 滚动适应
    if (
      $('#luckysheet-cell-main .luckysheet-data-visualization-chart').length > 0
    ) {
      // 当前sheet有图表才需要滚动适应
      const chart =
        Store.luckysheetfile[getSheetIndex(Store.currentSheetIndex)]['chart']

      if (chart != null && chart.length > 0) {
        _this.scrollAdaptOfchart()
      }
    }

    //有冻结时 批注框 滚动适应
    if ($('#luckysheet-postil-showBoxs .luckysheet-postil-show').length > 0) {
      _this.scrollAdaptOfpostil()
    }

    //有冻结时 下拉选区图标 滚动适应
    if ($('#luckysheet-dropCell-icon').length > 0) {
      _this.scrollAdaptOfdpicon()
    }

    //有冻结时 筛选下拉按钮 滚动适应
    if (
      $(
        '#luckysheet-filter-options-sheet' +
          Store.currentSheetIndex +
          ' .luckysheet-filter-options'
      ).length > 0
    ) {
      _this.scrollAdaptOffilteroptions()
    }
  },
  scrollAdaptOfselect: function() {
    let _this = this

    if ($('#luckysheet-row-count-show').is(':visible')) {
      $('#luckysheet-row-count-show').hide()
    }

    if ($('#luckysheet-column-count-show').is(':visible')) {
      $('#luckysheet-column-count-show').hide()
    }

    $('#luckysheet-rows-h-selected').empty()
    $('#luckysheet-cols-h-selected').empty()

    let scrollTop = $('#luckysheet-cell-main').scrollTop()
    let scrollLeft = $('#luckysheet-cell-main').scrollLeft()

    if (
      _this.freezenhorizontaldata != null &&
      _this.freezenverticaldata != null
    ) {
      let freezenTop = _this.freezenhorizontaldata[0]
      let freezen_rowindex = _this.freezenhorizontaldata[1]
      let offTop = scrollTop - _this.freezenhorizontaldata[2]

      let freezenLeft = _this.freezenverticaldata[0]
      let freezen_colindex = _this.freezenverticaldata[1]
      let offLeft = scrollLeft - _this.freezenverticaldata[2]

      for (let s = 0; s < Store.luckysheet_select_save.length; s++) {
        let obj = $.extend(true, {}, Store.luckysheet_select_save[s])

        let r1 = obj.row[0],
          r2 = obj.row[1]

        let row = Store.visibledatarow[r2],
          row_pre = r1 - 1 == -1 ? 0 : Store.visibledatarow[r1 - 1]

        let top_move = row_pre
        let height_move = row - row_pre - 1

        let rangeshow = true

        if (r1 >= freezen_rowindex) {
          //原选区在冻结区外
          if (top_move + height_move < freezenTop + offTop) {
            rangeshow = false
          } else if (top_move < freezenTop + offTop) {
            $('#luckysheet-cell-selected-boxs')
              .find('.luckysheet-cell-selected')
              .eq(s)
              .show()
              .css({
                top: freezenTop + offTop,
                height: height_move - (freezenTop + offTop - top_move),
              })
          } else {
            $('#luckysheet-cell-selected-boxs')
              .find('.luckysheet-cell-selected')
              .eq(s)
              .show()
              .css({
                top: top_move,
                height: height_move,
              })
          }
        } else if (r2 >= freezen_rowindex) {
          //原选区有一部分在冻结区内
          if (top_move + height_move < freezenTop + offTop) {
            $('#luckysheet-cell-selected-boxs')
              .find('.luckysheet-cell-selected')
              .eq(s)
              .show()
              .css({
                top: top_move + offTop,
                height: freezenTop - top_move,
              })
          } else {
            $('#luckysheet-cell-selected-boxs')
              .find('.luckysheet-cell-selected')
              .eq(s)
              .show()
              .css({
                top: top_move + offTop,
                height: height_move - offTop,
              })
          }
        } else {
          //原选区在冻结区内
          $('#luckysheet-cell-selected-boxs')
            .find('.luckysheet-cell-selected')
            .eq(s)
            .show()
            .css('top', top_move + offTop)
        }

        let c1 = obj.column[0],
          c2 = obj.column[1]

        let col = Store.visibledatacolumn[c2],
          col_pre = c1 - 1 == -1 ? 0 : Store.visibledatacolumn[c1 - 1]

        let left_move = col_pre
        let width_move = col - col_pre - 1

        if (c1 >= freezen_colindex) {
          //原选区在冻结区外
          if (left_move + width_move < freezenLeft + offLeft) {
            rangeshow = false
          } else if (left_move < freezenLeft + offLeft) {
            $('#luckysheet-cell-selected-boxs')
              .find('.luckysheet-cell-selected')
              .eq(s)
              .show()
              .css({
                left: freezenLeft + offLeft,
                width: width_move - (freezenLeft + offLeft - left_move),
              })
          } else {
            $('#luckysheet-cell-selected-boxs')
              .find('.luckysheet-cell-selected')
              .eq(s)
              .show()
              .css({
                left: left_move,
                width: width_move,
              })
          }
        } else if (c2 >= freezen_colindex) {
          //原选区有一部分在冻结区内
          if (left_move + width_move < freezenLeft + offLeft) {
            $('#luckysheet-cell-selected-boxs')
              .find('.luckysheet-cell-selected')
              .eq(s)
              .show()
              .css({
                left: left_move + offLeft,
                width: freezenLeft - left_move,
              })
          } else {
            $('#luckysheet-cell-selected-boxs')
              .find('.luckysheet-cell-selected')
              .eq(s)
              .show()
              .css({
                left: left_move + offLeft,
                width: width_move - offLeft,
              })
          }
        } else {
          //原选区在冻结区内
          $('#luckysheet-cell-selected-boxs')
            .find('.luckysheet-cell-selected')
            .eq(s)
            .show()
            .css('left', left_move + offLeft)
        }

        if (!rangeshow) {
          $('#luckysheet-cell-selected-boxs')
            .find('.luckysheet-cell-selected')
            .eq(s)
            .hide()
        }

        if (s == Store.luckysheet_select_save.length - 1) {
          let rf = obj.row_focus == null ? r1 : obj.row_focus
          let cf = obj.column_focus == null ? c1 : obj.column_focus

          let row_f = Store.visibledatarow[rf],
            row_pre_f = rf - 1 == -1 ? 0 : Store.visibledatarow[rf - 1]
          let col_f = Store.visibledatacolumn[cf],
            col_pre_f = cf - 1 == -1 ? 0 : Store.visibledatacolumn[cf - 1]

          let margeset = menuButton.mergeborer(Store.flowdata, rf, cf)
          if (!!margeset) {
            row_f = margeset.row[1]
            row_pre_f = margeset.row[0]

            col_f = margeset.column[1]
            col_pre_f = margeset.column[0]
          }

          let top = row_pre_f
          let height = row_f - row_pre_f - 1

          let left = col_pre_f
          let width = col_f - col_pre_f - 1

          let focuscell = true

          if (top >= freezenTop) {
            if (top + height < freezenTop + offTop) {
              focuscell = false
            } else if (top < freezenTop + offTop) {
              $('#luckysheet-cell-selected-focus')
                .show()
                .css({
                  top: freezenTop + offTop,
                  height: height - (freezenTop + offTop - top),
                })
            } else {
              $('#luckysheet-cell-selected-focus')
                .show()
                .css({
                  top: top,
                  height: height,
                })
            }
          } else if (top + height >= freezenTop) {
            if (top + height < freezenTop + offTop) {
              $('#luckysheet-cell-selected-focus')
                .show()
                .css({
                  top: top + offTop,
                  height: freezenTop - top,
                })
            } else {
              $('#luckysheet-cell-selected-focus')
                .show()
                .css({
                  top: top + offTop,
                  height: height - offTop,
                })
            }
          } else {
            $('#luckysheet-cell-selected-focus')
              .show()
              .css('top', top + offTop)
          }

          if (left >= freezenLeft) {
            if (left + width < freezenLeft + offLeft) {
              focuscell = false
            } else if (left < freezenLeft + offLeft) {
              $('#luckysheet-cell-selected-focus')
                .show()
                .css({
                  left: freezenLeft + offLeft,
                  width: width - (freezenLeft + offLeft - left),
                })
            } else {
              $('#luckysheet-cell-selected-focus')
                .show()
                .css({
                  left: left,
                  width: width,
                })
            }
          } else if (left + width >= freezenLeft) {
            if (left + width < freezenLeft + offLeft) {
              $('#luckysheet-cell-selected-focus')
                .show()
                .css({
                  left: left + offLeft,
                  width: freezenLeft - left,
                })
            } else {
              $('#luckysheet-cell-selected-focus')
                .show()
                .css({
                  left: left + offLeft,
                  width: width - offLeft,
                })
            }
          } else {
            $('#luckysheet-cell-selected-focus')
              .show()
              .css('left', left + offLeft)
          }

          if (!focuscell) {
            $('#luckysheet-cell-selected-focus').hide()
          }
        }
      }
    } else if (_this.freezenhorizontaldata != null) {
      let freezenTop = _this.freezenhorizontaldata[0]
      let freezen_rowindex = _this.freezenhorizontaldata[1]
      let offTop = scrollTop - _this.freezenhorizontaldata[2]

      for (let s = 0; s < Store.luckysheet_select_save.length; s++) {
        let obj = $.extend(true, {}, Store.luckysheet_select_save[s])

        let r1 = obj.row[0],
          r2 = obj.row[1]

        let row = Store.visibledatarow[r2],
          row_pre = r1 - 1 == -1 ? 0 : Store.visibledatarow[r1 - 1]

        let top_move = row_pre
        let height_move = row - row_pre - 1

        if (r1 >= freezen_rowindex) {
          //原选区在冻结区外
          if (top_move + height_move < freezenTop + offTop) {
            $('#luckysheet-cell-selected-boxs')
              .find('.luckysheet-cell-selected')
              .eq(s)
              .hide()
          } else if (top_move < freezenTop + offTop) {
            $('#luckysheet-cell-selected-boxs')
              .find('.luckysheet-cell-selected')
              .eq(s)
              .show()
              .css({
                top: freezenTop + offTop,
                height: height_move - (freezenTop + offTop - top_move),
              })
          } else {
            $('#luckysheet-cell-selected-boxs')
              .find('.luckysheet-cell-selected')
              .eq(s)
              .show()
              .css({
                top: top_move,
                height: height_move,
              })
          }
        } else if (r2 >= freezen_rowindex) {
          //原选区有一部分在冻结区内
          if (top_move + height_move < freezenTop + offTop) {
            $('#luckysheet-cell-selected-boxs')
              .find('.luckysheet-cell-selected')
              .eq(s)
              .show()
              .css({
                top: top_move + offTop,
                height: freezenTop - top_move,
              })
          } else {
            $('#luckysheet-cell-selected-boxs')
              .find('.luckysheet-cell-selected')
              .eq(s)
              .show()
              .css({
                top: top_move + offTop,
                height: height_move - offTop,
              })
          }
        } else {
          //原选区在冻结区内
          $('#luckysheet-cell-selected-boxs')
            .find('.luckysheet-cell-selected')
            .eq(s)
            .show()
            .css('top', top_move + offTop)
        }

        if (s == Store.luckysheet_select_save.length - 1) {
          let rf = obj.row_focus == null ? r1 : obj.row_focus
          let cf = obj.column_focus == null ? obj.column[0] : obj.column_focus

          let row_f = Store.visibledatarow[rf],
            row_pre_f = rf - 1 == -1 ? 0 : Store.visibledatarow[rf - 1]

          let margeset = menuButton.mergeborer(Store.flowdata, rf, cf)
          if (!!margeset) {
            row_f = margeset.row[1]
            row_pre_f = margeset.row[0]
          }

          let top = row_pre_f
          let height = row_f - row_pre_f - 1

          if (top >= freezenTop) {
            if (top + height < freezenTop + offTop) {
              $('#luckysheet-cell-selected-focus').hide()
            } else if (top < freezenTop + offTop) {
              $('#luckysheet-cell-selected-focus')
                .show()
                .css({
                  top: freezenTop + offTop,
                  height: height - (freezenTop + offTop - top),
                })
            } else {
              $('#luckysheet-cell-selected-focus')
                .show()
                .css({
                  top: top,
                  height: height,
                })
            }
          } else if (top + height >= freezenTop) {
            if (top + height < freezenTop + offTop) {
              $('#luckysheet-cell-selected-focus')
                .show()
                .css({
                  top: top + offTop,
                  height: freezenTop - top,
                })
            } else {
              $('#luckysheet-cell-selected-focus')
                .show()
                .css({
                  top: top + offTop,
                  height: height - offTop,
                })
            }
          } else {
            $('#luckysheet-cell-selected-focus')
              .show()
              .css('top', top + offTop)
          }
        }
      }
    } else if (_this.freezenverticaldata != null) {
      let freezenLeft = _this.freezenverticaldata[0]
      let freezen_colindex = _this.freezenverticaldata[1]
      let offLeft = scrollLeft - _this.freezenverticaldata[2]

      for (let s = 0; s < Store.luckysheet_select_save.length; s++) {
        let obj = $.extend(true, {}, Store.luckysheet_select_save[s])

        let c1 = obj.column[0],
          c2 = obj.column[1]

        let col = Store.visibledatacolumn[c2],
          col_pre = c1 - 1 == -1 ? 0 : Store.visibledatacolumn[c1 - 1]

        let left_move = col_pre
        let width_move = col - col_pre - 1

        if (c1 >= freezen_colindex) {
          //原选区在冻结区外
          if (left_move + width_move < freezenLeft + offLeft) {
            $('#luckysheet-cell-selected-boxs')
              .find('.luckysheet-cell-selected')
              .eq(s)
              .hide()
          } else if (left_move < freezenLeft + offLeft) {
            $('#luckysheet-cell-selected-boxs')
              .find('.luckysheet-cell-selected')
              .eq(s)
              .show()
              .css({
                left: freezenLeft + offLeft,
                width: width_move - (freezenLeft + offLeft - left_move),
              })
          } else {
            $('#luckysheet-cell-selected-boxs')
              .find('.luckysheet-cell-selected')
              .eq(s)
              .show()
              .css({
                left: left_move,
                width: width_move,
              })
          }
        } else if (c2 >= freezen_colindex) {
          //原选区有一部分在冻结区内
          if (left_move + width_move < freezenLeft + offLeft) {
            $('#luckysheet-cell-selected-boxs')
              .find('.luckysheet-cell-selected')
              .eq(s)
              .show()
              .css({
                left: left_move + offLeft,
                width: freezenLeft - left_move,
              })
          } else {
            $('#luckysheet-cell-selected-boxs')
              .find('.luckysheet-cell-selected')
              .eq(s)
              .show()
              .css({
                left: left_move + offLeft,
                width: width_move - offLeft,
              })
          }
        } else {
          //原选区在冻结区内
          $('#luckysheet-cell-selected-boxs')
            .find('.luckysheet-cell-selected')
            .eq(s)
            .show()
            .css('left', left_move + offLeft)
        }

        if (s == Store.luckysheet_select_save.length - 1) {
          let rf = obj.row_focus == null ? obj.row[0] : obj.row_focus
          let cf = obj.column_focus == null ? c1 : obj.column_focus

          let col_f = Store.visibledatacolumn[cf],
            col_pre_f = cf - 1 == -1 ? 0 : Store.visibledatacolumn[cf - 1]

          let margeset = menuButton.mergeborer(Store.flowdata, rf, cf)
          if (!!margeset) {
            col_f = margeset.column[1]
            col_pre_f = margeset.column[0]
          }

          let left = col_pre_f
          let width = col_f - col_pre_f - 1

          if (left >= freezenLeft) {
            if (left + width < freezenLeft + offLeft) {
              $('#luckysheet-cell-selected-focus').hide()
            } else if (left < freezenLeft + offLeft) {
              $('#luckysheet-cell-selected-focus')
                .show()
                .css({
                  left: freezenLeft + offLeft,
                  width: width - (freezenLeft + offLeft - left),
                })
            } else {
              $('#luckysheet-cell-selected-focus')
                .show()
                .css({
                  left: left,
                  width: width,
                })
            }
          } else if (left + width >= freezenLeft) {
            if (left + width < freezenLeft + offLeft) {
              $('#luckysheet-cell-selected-focus')
                .show()
                .css({
                  left: left + offLeft,
                  width: freezenLeft - left,
                })
            } else {
              $('#luckysheet-cell-selected-focus')
                .show()
                .css({
                  left: left + offLeft,
                  width: width - offLeft,
                })
            }
          } else {
            $('#luckysheet-cell-selected-focus')
              .show()
              .css('left', left + offLeft)
          }
        }
      }
    } else {
      selectHightlightShow()
    }
  },
  scrollAdaptOfchart: function() {
    let _this = this

    let scrollTop = $('#luckysheet-cell-main').scrollTop()
    let scrollLeft = $('#luckysheet-cell-main').scrollLeft()

    if (
      _this.freezenhorizontaldata != null &&
      _this.freezenverticaldata != null
    ) {
      let freezenTop =
        _this.freezenhorizontaldata[0] - _this.freezenhorizontaldata[2]
      let freezenLeft =
        _this.freezenverticaldata[0] - _this.freezenverticaldata[2]

      $('#luckysheet-cell-main .luckysheet-data-visualization-chart').each(
        function(i, e) {
          let x = $(e).position()
          let width = $(e).width()
          let height = $(e).height()

          let $canvas_width = $(e)
            .find('canvas')
            .width()
          let $canvas_height = $(e)
            .find('canvas')
            .height()

          let height_diff = $canvas_height - height
          let width_diff = $canvas_width - width

          if (x.top - height_diff < freezenTop) {
            let size = freezenTop - (x.top - height_diff)

            if (size > $canvas_height + 40 + 2) {
              $(e).css('visibility', 'hidden')
            } else {
              $(e).css({
                top: freezenTop + scrollTop,
                height: $canvas_height - size,
                visibility: 'visible',
              })
              $(e)
                .find('canvas')
                .css('top', -size)
            }
          } else {
            $(e).css({
              top: x.top - height_diff + scrollTop,
              height: $canvas_height,
              visibility: 'visible',
            })
            $(e)
              .find('canvas')
              .css('top', 0)
          }

          if (x.left - width_diff < freezenLeft) {
            let size = freezenLeft - (x.left - width_diff)

            if (size > $canvas_width + 20 + 2) {
              $(e).css('visibility', 'hidden')
            } else {
              $(e).css({
                left: freezenLeft + scrollLeft,
                width: $canvas_width - size,
                visibility: 'visible',
              })
              $(e)
                .find('canvas')
                .css('left', -size)
            }
          } else {
            $(e).css({
              left: x.left - width_diff + scrollLeft,
              width: $canvas_width,
              visibility: 'visible',
            })
            $(e)
              .find('canvas')
              .css('left', 0)
          }
        }
      )
    } else if (_this.freezenhorizontaldata != null) {
      let freezenTop =
        _this.freezenhorizontaldata[0] - _this.freezenhorizontaldata[2]

      $('#luckysheet-cell-main .luckysheet-data-visualization-chart').each(
        function(i, e) {
          let x = $(e).position()
          let height = $(e).height()

          let $canvas_height = $(e)
            .find('canvas')
            .height()

          let height_diff = $canvas_height - height

          if (x.top - height_diff < freezenTop) {
            let size = freezenTop - (x.top - height_diff)

            if (size > $canvas_height + 40 + 2) {
              $(e).css('visibility', 'hidden')
            } else {
              $(e).css({
                top: freezenTop + scrollTop,
                height: $canvas_height - size,
                visibility: 'visible',
              })
              $(e)
                .find('canvas')
                .css('top', -size)
            }
          } else {
            $(e).css({
              top: x.top - height_diff + scrollTop,
              height: $canvas_height,
              visibility: 'visible',
            })
            $(e)
              .find('canvas')
              .css('top', 0)
          }
        }
      )
    } else if (_this.freezenverticaldata != null) {
      let freezenLeft =
        _this.freezenverticaldata[0] - _this.freezenverticaldata[2]

      $('#luckysheet-cell-main .luckysheet-data-visualization-chart').each(
        function(i, e) {
          let x = $(e).position()
          let width = $(e).width()

          let $canvas_width = $(e)
            .find('canvas')
            .width()

          let width_diff = $canvas_width - width

          if (x.left - width_diff < freezenLeft) {
            let size = freezenLeft - (x.left - width_diff)

            if (size > $canvas_width + 20 + 2) {
              $(e).css('visibility', 'hidden')
            } else {
              $(e).css({
                left: freezenLeft + scrollLeft,
                width: $canvas_width - size,
                visibility: 'visible',
              })
              $(e)
                .find('canvas')
                .css('left', -size)
            }
          } else {
            $(e).css({
              left: x.left - width_diff + scrollLeft,
              width: $canvas_width,
              visibility: 'visible',
            })
            $(e)
              .find('canvas')
              .css('left', 0)
          }
        }
      )
    } else {
      $('#luckysheet-cell-main .luckysheet-data-visualization-chart').each(
        function(i, e) {
          let x = $(e).position()
          let width = $(e).width()
          let height = $(e).height()

          let $canvas_width = $(e)
            .find('canvas')
            .width()
          let $canvas_height = $(e)
            .find('canvas')
            .height()

          let height_diff = $canvas_height - height
          let width_diff = $canvas_width - width

          $(e).css({
            top: x.top - height_diff + scrollTop,
            height: $canvas_height,
            left: x.left - width_diff + scrollLeft,
            width: $canvas_width,
            visibility: 'visible',
          })

          $(e)
            .find('canvas')
            .css({
              top: 0,
              left: 0,
            })
        }
      )
    }
  },
  scrollAdaptOfpostil: function() {
    let _this = this

    let scrollTop = $('#luckysheet-cell-main').scrollTop()
    let scrollLeft = $('#luckysheet-cell-main').scrollLeft()

    if (
      _this.freezenhorizontaldata != null &&
      _this.freezenverticaldata != null
    ) {
      let freezenTop = _this.freezenhorizontaldata[0]
      let freezenLeft = _this.freezenverticaldata[0]

      let offTop = scrollTop - _this.freezenhorizontaldata[2]
      let offLeft = scrollLeft - _this.freezenverticaldata[2]

      $('#luckysheet-postil-showBoxs .luckysheet-postil-show').each(function(
        i,
        e
      ) {
        let id = $(e).attr('id')

        let r = id.split('luckysheet-postil-show_')[1].split('_')[0]
        let c = id.split('luckysheet-postil-show_')[1].split('_')[1]

        let postil = Store.flowdata[r][c].ps

        let row = Store.visibledatarow[r],
          row_pre = r - 1 == -1 ? 0 : Store.visibledatarow[r - 1]
        let col = Store.visibledatacolumn[c],
          col_pre = c - 1 == -1 ? 0 : Store.visibledatacolumn[c - 1]

        let margeset = menuButton.mergeborer(Store.flowdata, r, c)
        if (!!margeset) {
          row = margeset.row[1]
          row_pre = margeset.row[0]

          col = margeset.column[1]
          col_pre = margeset.column[0]
        }

        let toX = col
        let toY = row_pre

        let postil_left = postil['left'] == null ? toX + 18 : postil['left']
        let postil_top = postil['top'] == null ? toY - 18 : postil['top']
        let postil_width =
          postil['width'] == null
            ? luckysheetPostil.defaultWidth
            : postil['width']
        let postil_height =
          postil['height'] == null
            ? luckysheetPostil.defaultHeight
            : postil['height']

        if (postil_top < 0) {
          postil_top = 2
        }

        let size = luckysheetPostil.getArrowCanvasSize(
          postil_left,
          postil_top,
          toX,
          toY
        )
        let show = true
        let show2 = true

        if (r >= _this.freezenhorizontaldata[1]) {
          if (postil_top + postil_height < freezenTop) {
            $(e)
              .show()
              .find('.luckysheet-postil-show-main')
              .css('top', postil_top + offTop)
            $(e)
              .show()
              .find('.arrowCanvas')
              .css('top', size[1] + offTop)
          } else {
            if (postil_top < freezenTop + offTop) {
              if (postil_top + postil_height <= freezenTop + offTop) {
                show = false
              } else {
                $(e)
                  .show()
                  .find('.luckysheet-postil-show-main')
                  .css({
                    top: freezenTop + offTop,
                    height: postil_height - (freezenTop + offTop - postil_top),
                  })
                $(e)
                  .show()
                  .find('.formulaInputFocus')
                  .css('margin-top', -(freezenTop + offTop - postil_top))
                $(e)
                  .show()
                  .find('.arrowCanvas')
                  .hide()

                show2 = false
              }
            } else {
              $(e)
                .show()
                .find('.luckysheet-postil-show-main')
                .css({
                  top: postil_top,
                  height: postil_height,
                })
              $(e)
                .show()
                .find('.formulaInputFocus')
                .css('margin-top', 0)
              $(e)
                .show()
                .find('.arrowCanvas')
                .css('top', size[1])
              // luckysheetPostil.buildPs(r, c, postil);
            }
          }
        } else {
          $(e)
            .show()
            .find('.luckysheet-postil-show-main')
            .css('top', postil_top + offTop)
          $(e)
            .show()
            .find('.arrowCanvas')
            .css('top', size[1] + offTop)
        }

        if (c >= _this.freezenverticaldata[1]) {
          if (postil_left + postil_width < freezenLeft) {
            $(e)
              .show()
              .find('.luckysheet-postil-show-main')
              .css('left', postil_left + offLeft)
            $(e)
              .show()
              .find('.arrowCanvas')
              .css('left', size[0] + offLeft)
          } else {
            if (postil_left < freezenLeft + offLeft) {
              if (postil_left + postil_width <= freezenLeft + offLeft) {
                show = false
              } else {
                $(e)
                  .show()
                  .find('.luckysheet-postil-show-main')
                  .css({
                    left: freezenLeft + offLeft,
                    width: postil_width - (freezenLeft + offLeft - postil_left),
                  })
                $(e)
                  .show()
                  .find('.formulaInputFocus')
                  .css('margin-left', -(freezenLeft + offLeft - postil_left))
                $(e)
                  .show()
                  .find('.arrowCanvas')
                  .hide()

                show2 = false
              }
            } else {
              $(e)
                .show()
                .find('.luckysheet-postil-show-main')
                .css({
                  left: postil_left,
                  width: postil_width,
                })
              $(e)
                .show()
                .find('.formulaInputFocus')
                .css('margin-left', 0)
              $(e)
                .show()
                .find('.arrowCanvas')
                .css('left', size[0])
              // luckysheetPostil.buildPs(r, c, postil);
            }
          }
        } else {
          $(e)
            .show()
            .find('.luckysheet-postil-show-main')
            .css('left', postil_left + offLeft)
          $(e)
            .show()
            .find('.arrowCanvas')
            .css('left', size[0] + offLeft)
        }

        if (!show) {
          $(e).hide()
        }

        if (show && show2) {
          $(e)
            .show()
            .find('.arrowCanvas')
            .show()
        }
      })
    } else if (_this.freezenhorizontaldata != null) {
      let freezenTop = _this.freezenhorizontaldata[0]
      let offTop = scrollTop - _this.freezenhorizontaldata[2]

      $('#luckysheet-postil-showBoxs .luckysheet-postil-show').each(function(
        i,
        e
      ) {
        let id = $(e).attr('id')

        let r = id.split('luckysheet-postil-show_')[1].split('_')[0]
        let c = id.split('luckysheet-postil-show_')[1].split('_')[1]

        let postil = Store.flowdata[r][c].ps

        let row = Store.visibledatarow[r],
          row_pre = r - 1 == -1 ? 0 : Store.visibledatarow[r - 1]
        let col = Store.visibledatacolumn[c],
          col_pre = c - 1 == -1 ? 0 : Store.visibledatacolumn[c - 1]

        let margeset = menuButton.mergeborer(Store.flowdata, r, c)
        if (!!margeset) {
          row = margeset.row[1]
          row_pre = margeset.row[0]

          col = margeset.column[1]
          col_pre = margeset.column[0]
        }

        let toX = col
        let toY = row_pre

        let postil_left = postil['left'] == null ? toX + 18 : postil['left']
        let postil_top = postil['top'] == null ? toY - 18 : postil['top']
        let postil_width =
          postil['width'] == null
            ? luckysheetPostil.defaultWidth
            : postil['width']
        let postil_height =
          postil['height'] == null
            ? luckysheetPostil.defaultHeight
            : postil['height']

        if (postil_top < 0) {
          postil_top = 2
        }

        let size = luckysheetPostil.getArrowCanvasSize(
          postil_left,
          postil_top,
          toX,
          toY
        )

        if (r >= _this.freezenhorizontaldata[1]) {
          if (postil_top + postil_height < freezenTop) {
            $(e)
              .show()
              .find('.luckysheet-postil-show-main')
              .css('top', postil_top + offTop)
            $(e)
              .show()
              .find('.arrowCanvas')
              .css('top', size[1] + offTop)
          } else {
            if (postil_top < freezenTop + offTop) {
              if (postil_top + postil_height <= freezenTop + offTop) {
                $(e).hide()
              } else {
                $(e)
                  .show()
                  .find('.luckysheet-postil-show-main')
                  .css({
                    top: freezenTop + offTop,
                    height: postil_height - (freezenTop + offTop - postil_top),
                  })
                $(e)
                  .show()
                  .find('.formulaInputFocus')
                  .css('margin-top', -(freezenTop + offTop - postil_top))
                $(e)
                  .show()
                  .find('.arrowCanvas')
                  .hide()
              }
            } else {
              luckysheetPostil.buildPs(r, c, postil)
            }
          }
        } else {
          $(e)
            .show()
            .find('.luckysheet-postil-show-main')
            .css('top', postil_top + offTop)
          $(e)
            .show()
            .find('.arrowCanvas')
            .css('top', size[1] + offTop)
        }
      })
    } else if (_this.freezenverticaldata != null) {
      let freezenLeft = _this.freezenverticaldata[0]
      let offLeft = scrollLeft - _this.freezenverticaldata[2]

      $('#luckysheet-postil-showBoxs .luckysheet-postil-show').each(function(
        i,
        e
      ) {
        let id = $(e).attr('id')

        let r = id.split('luckysheet-postil-show_')[1].split('_')[0]
        let c = id.split('luckysheet-postil-show_')[1].split('_')[1]

        let postil = Store.flowdata[r][c].ps

        let row = Store.visibledatarow[r],
          row_pre = r - 1 == -1 ? 0 : Store.visibledatarow[r - 1]
        let col = Store.visibledatacolumn[c],
          col_pre = c - 1 == -1 ? 0 : Store.visibledatacolumn[c - 1]

        let margeset = menuButton.mergeborer(Store.flowdata, r, c)
        if (!!margeset) {
          row = margeset.row[1]
          row_pre = margeset.row[0]

          col = margeset.column[1]
          col_pre = margeset.column[0]
        }

        let toX = col
        let toY = row_pre

        let postil_left = postil['left'] == null ? toX + 18 : postil['left']
        let postil_top = postil['top'] == null ? toY - 18 : postil['top']
        let postil_width =
          postil['width'] == null
            ? luckysheetPostil.defaultWidth
            : postil['width']
        let postil_height =
          postil['height'] == null
            ? luckysheetPostil.defaultHeight
            : postil['height']

        if (postil_top < 0) {
          postil_top = 2
        }

        let size = luckysheetPostil.getArrowCanvasSize(
          postil_left,
          postil_top,
          toX,
          toY
        )

        if (c >= _this.freezenverticaldata[1]) {
          if (postil_left + postil_width < freezenLeft) {
            $(e)
              .show()
              .find('.luckysheet-postil-show-main')
              .css('left', postil_left + offLeft)
            $(e)
              .show()
              .find('.arrowCanvas')
              .css('left', size[0] + offLeft)
          } else {
            if (postil_left < freezenLeft + offLeft) {
              if (postil_left + postil_width <= freezenLeft + offLeft) {
                $(e).hide()
              } else {
                $(e)
                  .show()
                  .find('.luckysheet-postil-show-main')
                  .css({
                    left: freezenLeft + offLeft,
                    width: postil_width - (freezenLeft + offLeft - postil_left),
                  })
                $(e)
                  .show()
                  .find('.formulaInputFocus')
                  .css('margin-left', -(freezenLeft + offLeft - postil_left))
                $(e)
                  .show()
                  .find('.arrowCanvas')
                  .hide()
              }
            } else {
              luckysheetPostil.buildPs(r, c, postil)
            }
          }
        } else {
          $(e)
            .show()
            .find('.luckysheet-postil-show-main')
            .css('left', postil_left + offLeft)
          $(e)
            .show()
            .find('.arrowCanvas')
            .css('left', size[0] + offLeft)
        }
      })
    } else {
      $('#luckysheet-postil-showBoxs .luckysheet-postil-show').each(function(
        i,
        e
      ) {
        let id = $(e).attr('id')

        let r = id.split('luckysheet-postil-show_')[1].split('_')[0]
        let c = id.split('luckysheet-postil-show_')[1].split('_')[1]

        let postil = Store.flowdata[r][c].ps

        luckysheetPostil.buildPs(r, c, postil)
      })
    }
  },
  scrollAdaptOfdpicon: function() {
    let _this = this

    let copy_r = luckysheetDropCell.copyRange['row'][1],
      copy_c = luckysheetDropCell.copyRange['column'][1]

    let apply_r = luckysheetDropCell.applyRange['row'][1],
      apply_c = luckysheetDropCell.applyRange['column'][1]

    let row_index, col_index
    if (apply_r >= copy_r && apply_c >= copy_c) {
      row_index = apply_r
      col_index = apply_c
    } else {
      row_index = copy_r
      col_index = copy_c
    }

    if (
      _this.freezenhorizontaldata != null &&
      _this.freezenverticaldata != null
    ) {
      let freezen_rowindex = _this.freezenhorizontaldata[1]
      let offsetRow = luckysheet_searcharray(
        _this.freezenhorizontaldata[3],
        $('#luckysheet-cell-main').scrollTop() - _this.freezenhorizontaldata[2]
      )
      let freezen_colindex = _this.freezenverticaldata[1]
      let offsetColumn = luckysheet_searcharray(
        _this.freezenverticaldata[3],
        $('#luckysheet-cell-main').scrollLeft() - _this.freezenverticaldata[2]
      )

      if (row_index >= freezen_rowindex && col_index >= freezen_colindex) {
        if (
          row_index < freezen_rowindex + offsetRow - 1 ||
          col_index < freezen_colindex + offsetColumn - 1
        ) {
          $('#luckysheet-dropCell-icon').hide()
        } else {
          $('#luckysheet-dropCell-icon').show()
        }
      } else if (row_index >= freezen_rowindex) {
        if (row_index < freezen_rowindex + offsetRow - 1) {
          $('#luckysheet-dropCell-icon').hide()
        } else {
          let col = colLocationByIndex(col_index + offsetColumn)[1]

          $('#luckysheet-dropCell-icon')
            .show()
            .css('left', col)
        }
      } else if (col_index >= freezen_colindex) {
        if (col_index < freezen_colindex + offsetColumn - 1) {
          $('#luckysheet-dropCell-icon').hide()
        } else {
          let row = rowLocationByIndex(row_index + offsetRow)[1]

          $('#luckysheet-dropCell-icon')
            .show()
            .css('top', row)
        }
      } else {
        let row = rowLocationByIndex(row_index + offsetRow)[1],
          col = colLocationByIndex(col_index + offsetColumn)[1]

        $('#luckysheet-dropCell-icon')
          .show()
          .css({ left: col, top: row })
      }
    } else if (_this.freezenhorizontaldata != null) {
      let freezen_rowindex = _this.freezenhorizontaldata[1]
      let offsetRow = luckysheet_searcharray(
        _this.freezenhorizontaldata[3],
        $('#luckysheet-cell-main').scrollTop() - _this.freezenhorizontaldata[2]
      )

      if (row_index >= freezen_rowindex) {
        if (row_index < freezen_rowindex + offsetRow - 1) {
          $('#luckysheet-dropCell-icon').hide()
        } else {
          $('#luckysheet-dropCell-icon').show()
        }
      } else {
        let row = rowLocationByIndex(row_index + offsetRow)[1]

        $('#luckysheet-dropCell-icon')
          .show()
          .css('top', row)
      }
    } else if (_this.freezenverticaldata != null) {
      let freezen_colindex = _this.freezenverticaldata[1]
      let offsetColumn = luckysheet_searcharray(
        _this.freezenverticaldata[3],
        $('#luckysheet-cell-main').scrollLeft() - _this.freezenverticaldata[2]
      )

      if (col_index >= freezen_colindex) {
        if (col_index < freezen_colindex + offsetColumn - 1) {
          $('#luckysheet-dropCell-icon').hide()
        } else {
          $('#luckysheet-dropCell-icon').show()
        }
      } else {
        let col = colLocationByIndex(col_index + offsetColumn)[1]

        $('#luckysheet-dropCell-icon')
          .show()
          .css('left', col)
      }
    } else {
      let row = rowLocationByIndex(row_index)[1],
        col = colLocationByIndex(col_index)[1]

      $('#luckysheet-dropCell-icon')
        .show()
        .css({ left: col, top: row })
    }
  },
  scrollAdaptOffilteroptions: function() {
    let _this = this

    if (
      _this.freezenhorizontaldata != null &&
      _this.freezenverticaldata != null
    ) {
      let freezen_rowindex = _this.freezenhorizontaldata[1]
      let freezen_top =
        _this.freezenhorizontaldata[0] + $('#luckysheet-cell-main').scrollTop()

      let freezen_colindex = _this.freezenverticaldata[1]
      let offsetColumn = luckysheet_searcharray(
        _this.freezenverticaldata[3],
        $('#luckysheet-cell-main').scrollLeft() - _this.freezenverticaldata[2]
      )

      $(
        '#luckysheet-filter-options-sheet' +
          Store.currentSheetIndex +
          ' .luckysheet-filter-options'
      ).each(function(i, e) {
        let row_index = $(e).data('str')
        let top = row_index - 1 == -1 ? 0 : Store.visibledatarow[row_index - 1]

        let col_index = $(e).data('cindex')

        if (row_index >= freezen_rowindex && col_index >= freezen_colindex) {
          if (
            top < freezen_top ||
            col_index < freezen_colindex + offsetColumn
          ) {
            $(e).hide()
          } else {
            $(e).show()
          }
        } else if (row_index >= freezen_rowindex) {
          if (top < freezen_top) {
            $(e).hide()
          } else {
            let left = Store.visibledatacolumn[col_index + offsetColumn] - 20

            $(e)
              .show()
              .css('left', left)
          }
        } else if (col_index >= freezen_colindex) {
          if (col_index < freezen_colindex + offsetColumn) {
            $(e).hide()
          } else {
            $(e)
              .show()
              .css('top', top + $('#luckysheet-cell-main').scrollTop())
          }
        } else {
          let left = Store.visibledatacolumn[col_index + offsetColumn] - 20

          $(e)
            .show()
            .css({
              left: left,
              top: top + $('#luckysheet-cell-main').scrollTop(),
            })
        }
      })
    } else if (_this.freezenhorizontaldata != null) {
      let freezen_rowindex = _this.freezenhorizontaldata[1]
      let freezen_top =
        _this.freezenhorizontaldata[0] + $('#luckysheet-cell-main').scrollTop()

      $(
        '#luckysheet-filter-options-sheet' +
          Store.currentSheetIndex +
          ' .luckysheet-filter-options'
      ).each(function(i, e) {
        let row_index = $(e).data('str')
        let top = row_index - 1 == -1 ? 0 : Store.visibledatarow[row_index - 1]

        if (row_index >= freezen_rowindex) {
          if (top < freezen_top) {
            $(e).hide()
          } else {
            $(e).show()
          }
        } else {
          $(e)
            .show()
            .css('top', top + $('#luckysheet-cell-main').scrollTop())
        }
      })
    } else if (_this.freezenverticaldata != null) {
      let freezen_colindex = _this.freezenverticaldata[1]
      let offsetColumn = luckysheet_searcharray(
        _this.freezenverticaldata[3],
        $('#luckysheet-cell-main').scrollLeft() - _this.freezenverticaldata[2]
      )

      $(
        '#luckysheet-filter-options-sheet' +
          Store.currentSheetIndex +
          ' .luckysheet-filter-options'
      ).each(function(i, e) {
        let col_index = $(e).data('cindex')

        if (col_index >= freezen_colindex) {
          if (col_index < freezen_colindex + offsetColumn) {
            $(e).hide()
          } else {
            $(e).show()
          }
        } else {
          let left = Store.visibledatacolumn[col_index + offsetColumn] - 20

          $(e)
            .show()
            .css('left', left)
        }
      })
    } else {
      $('#luckysheet-filter-options-sheet' + Store.currentSheetIndex).empty()
      createFilterOptions(
        Store.luckysheetfile[getSheetIndex(Store.currentSheetIndex)]
          .filter_select
      )
    }
  },
  /**
   *
   * @param {string} operate  "freezenRow"/ "freezenColumn"......
   * @param {Number | String} order 工作表索引；默认值为当前工作表索引
   * @param {Object} focus 冻结选区时的focus单元格行列值构成的对象；格式为{ row_focus:0, column_focus:0 }
   */
  saveFrozen: function(operate, order, focus = {}) {
    if (order == null) {
      order = getSheetIndex(Store.currentSheetIndex)
    }

    // New configuration attribute of sheet: frozen, which stores more semantic configuration for initialization and transmission to the backend. freezenhorizontaldata is still used as local data

    const select_save =
      Store.luckysheet_select_save[Store.luckysheet_select_save.length - 1]

    const row_focus =
      select_save['row_focus'] == null
        ? select_save['row'][0]
        : select_save['row_focus']
    const column_focus =
      select_save['column_focus'] == null
        ? select_save['column'][0]
        : select_save['column_focus']

    const range = {
      row_focus: focus.row_focus || row_focus,
      column_focus: focus.column_focus || column_focus,
    }

    const frozen = {
      freezenRow: {
        type: 'row',
      },
      freezenColumn: {
        type: 'column',
      },
      freezenRC: {
        type: 'both',
      },
      freezenRowRange: {
        type: 'rangeRow',
        range: range,
      },
      freezenColumnRange: {
        type: 'rangeColumn',
        range: range,
      },
      freezenRCRange: {
        type: 'rangeBoth',
        range: range,
      },
      freezenCancel: {
        type: 'cancel',
      },
    }

    // store frozen
    Store.luckysheetfile[order]['frozen'] = frozen[operate]
  },
  frozenTofreezen: function() {
    // get frozen type
    let file = Store.luckysheetfile[getSheetIndex(Store.currentSheetIndex)]
    const frozen = file['frozen']

    if (frozen == null) {
      return
    }

    let freezen = null

    // transform to freezen
    if (frozen.type === 'row') {
      let scrollTop = 0
      let row_st = luckysheet_searcharray(Store.visibledatarow, scrollTop)
      if (row_st == -1) {
        row_st = 0
      }
      let top =
        Store.visibledatarow[row_st] - 2 - scrollTop + Store.columnHeaderHeight
      let freezenhorizontaldata = [
        Store.visibledatarow[row_st],
        row_st + 1,
        scrollTop,
        luckysheetFreezen.cutVolumn(Store.visibledatarow, row_st + 1),
        top,
      ]

      freezen = {
        horizontal: {
          freezenhorizontaldata: freezenhorizontaldata,
          top: top,
        },
      }
    } else if (frozen.type === 'column') {
      let scrollLeft = 0
      let col_st = luckysheet_searcharray(Store.visibledatacolumn, scrollLeft)
      if (col_st == -1) {
        col_st = 0
      }
      let left =
        Store.visibledatacolumn[col_st] - 2 - scrollLeft + Store.rowHeaderWidth
      let freezenverticaldata = [
        Store.visibledatacolumn[col_st],
        col_st + 1,
        scrollLeft,
        luckysheetFreezen.cutVolumn(Store.visibledatacolumn, col_st + 1),
        left,
      ]

      freezen = {
        vertical: {
          freezenverticaldata: freezenverticaldata,
          left: left,
        },
      }
    } else if (frozen.type === 'both') {
      let scrollTop = 0
      let row_st = luckysheet_searcharray(Store.visibledatarow, scrollTop)
      if (row_st == -1) {
        row_st = 0
      }
      let top =
        Store.visibledatarow[row_st] - 2 - scrollTop + Store.columnHeaderHeight
      let freezenhorizontaldata = [
        Store.visibledatarow[row_st],
        row_st + 1,
        scrollTop,
        luckysheetFreezen.cutVolumn(Store.visibledatarow, row_st + 1),
        top,
      ]

      let scrollLeft = 0
      let col_st = luckysheet_searcharray(Store.visibledatacolumn, scrollLeft)
      if (col_st == -1) {
        col_st = 0
      }
      let left =
        Store.visibledatacolumn[col_st] - 2 - scrollLeft + Store.rowHeaderWidth
      let freezenverticaldata = [
        Store.visibledatacolumn[col_st],
        col_st + 1,
        scrollLeft,
        luckysheetFreezen.cutVolumn(Store.visibledatacolumn, col_st + 1),
        left,
      ]

      freezen = {
        horizontal: {
          freezenhorizontaldata: freezenhorizontaldata,
          top: top,
        },
        vertical: {
          freezenverticaldata: freezenverticaldata,
          left: left,
        },
      }
    } else if (frozen.type === 'rangeRow') {
      let scrollTop = 0
      let row_st = luckysheet_searcharray(Store.visibledatarow, scrollTop)

      let row_focus = frozen.range['row_focus']

      if (row_focus > row_st) {
        row_st = row_focus
      }

      if (row_st == -1) {
        row_st = 0
      }

      let top =
        Store.visibledatarow[row_st] - 2 - scrollTop + Store.columnHeaderHeight
      let freezenhorizontaldata = [
        Store.visibledatarow[row_st],
        row_st + 1,
        scrollTop,
        luckysheetFreezen.cutVolumn(Store.visibledatarow, row_st + 1),
        top,
      ]

      freezen = {
        horizontal: {
          freezenhorizontaldata: freezenhorizontaldata,
          top: top,
        },
      }
    } else if (frozen.type === 'rangeColumn') {
      let scrollLeft = 0
      let col_st = luckysheet_searcharray(Store.visibledatacolumn, scrollLeft)

      let column_focus = frozen.range['column_focus']

      if (column_focus > col_st) {
        col_st = column_focus
      }

      if (col_st == -1) {
        col_st = 0
      }

      let left =
        Store.visibledatacolumn[col_st] - 2 - scrollLeft + Store.rowHeaderWidth
      let freezenverticaldata = [
        Store.visibledatacolumn[col_st],
        col_st + 1,
        scrollLeft,
        luckysheetFreezen.cutVolumn(Store.visibledatacolumn, col_st + 1),
        left,
      ]

      freezen = {
        vertical: {
          freezenverticaldata: freezenverticaldata,
          left: left,
        },
      }
    } else if (frozen.type === 'rangeBoth') {
      let scrollTop = 0
      let row_st = luckysheet_searcharray(Store.visibledatarow, scrollTop)

      let row_focus = frozen.range['row_focus']

      if (row_focus > row_st) {
        row_st = row_focus
      }

      if (row_st == -1) {
        row_st = 0
      }

      let top =
        Store.visibledatarow[row_st] - 2 - scrollTop + Store.columnHeaderHeight
      let freezenhorizontaldata = [
        Store.visibledatarow[row_st],
        row_st + 1,
        scrollTop,
        luckysheetFreezen.cutVolumn(Store.visibledatarow, row_st + 1),
        top,
      ]

      let scrollLeft = 0
      let col_st = luckysheet_searcharray(Store.visibledatacolumn, scrollLeft)

      let column_focus = frozen.range['column_focus']

      if (column_focus > col_st) {
        col_st = column_focus
      }

      if (col_st == -1) {
        col_st = 0
      }

      let left =
        Store.visibledatacolumn[col_st] - 2 - scrollLeft + Store.rowHeaderWidth
      let freezenverticaldata = [
        Store.visibledatacolumn[col_st],
        col_st + 1,
        scrollLeft,
        luckysheetFreezen.cutVolumn(Store.visibledatacolumn, col_st + 1),
        left,
      ]

      freezen = {
        horizontal: {
          freezenhorizontaldata: freezenhorizontaldata,
          top: top,
        },
        vertical: {
          freezenverticaldata: freezenverticaldata,
          left: left,
        },
      }
    } else if (frozen.type === 'cancel') {
      freezen = {
        horizontal: null,
        vertical: null,
      }
    }

    file['freezen'] = freezen
  },
}

export default luckysheetFreezen
